﻿// A.Array Recovery.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
/*
https://codeforces.com/problemset/problem/1739/B

对于大小为 n 的非负整数数组 a，我们按如下方式构造另一个数组 d：d1=a1, di=|ai-ai-1|，2≤i≤n。

你的任务是从给定的数组 d 中还原出数组 a，或者报告有多个可能的数组。

输入
第一行包含一个整数 t（1≤t≤100）--测试用例数。

每个测试用例的第一行包含一个整数 n（1≤n≤100）--数组 a 和 d 的大小。

第二行包含 n 个整数 d1,d2,...,dn（0≤di≤100）--数组 d 的元素。

可以证明，在这些限制条件下，总是存在至少一个合适的数组 a。
输出
对于每个测试用例，如果只有一个可能的数组 a，则打印数组 a 的元素，否则打印-1。
InputCopy
3
4
1 0 2 5
3
2 6 3
5
0 0 0 0 0
OutputCopy
1 1 3 8
-1
0 0 0 0 0

1
3
3 5 8

注释
在第二个示例中，有两个合适的数组： [2,8,5] 和 [2,8,11]。
*/


#include <cstring>
#include <iostream>

using namespace std;

const int N = 200;
int a[N], d[N];
int T;


void solve() {
	memset(a, 0, sizeof a);
	memset(d, 0, sizeof d);
	int n; cin >> n;
	for (int i = 0; i < n; i++) cin >> d[i];
	a[0] = d[0];
	for (int i = 1; i < n; i++) {
		if (d[i] == 0) a[i] = a[i - 1];
		else {
			int a1 = a[i - 1] + d[i];
			int a2 = a[i - 1] - d[i];
			if (a2 >= 0) {
				cout << -1 << endl;
				return;
			}
			a[i] = a1;
		}
	}

	for (int i = 0; i < n; i++) {
		cout << a[i] << " ";
	}
	cout << endl;
	return;
}



int main()
{
	cin >> T;
	while (T--) {
		solve();
	}

	return 0;
}
